package ArrayList;

import java.util.Arrays;

public class MyArrayList {
    private int[] elem; //用这个数组来存储数据
    private int usedSize; //用来计算表中的有效个数

    private static final int DEFAULLT_SIZE = 10;

    //无参构造方法中默认顺序表中为10个个数
    public MyArrayList() {
        this.elem = new int[DEFAULLT_SIZE];
    }

    //有参构造方法中指定顺序表的个数为num个
    public MyArrayList(int num) {
        this.elem = new int[num];
    }


    //打印顺序表的所有元素
    public void display() {
        for (int i = 0; i < this.usedSize - 1; i++) {
            System.out.print(this.elem[i] + " ");
        }
        System.out.println();
    }


    //判断表中是否包含元素data
    public boolean contains(int data) {
        for (int i = 0; i < this.usedSize; i++) {
            if (this.elem[i] == data) {
                return true;
            }
        }
        return false;

    }


    //查找元素data的位置
    public int search(int data) {
        for (int i = 0; i < this.usedSize; i++) {
            if (this.elem[i] == data) {
                return i;
            }
        }
        return -1;

    }

    public boolean isEmpty() {
        return this.usedSize == 0;
    }


    //获取pos下标这个位置的元素
    public int get(int pos) {
        //检验是否为空表
        if (isEmpty()) {
            System.out.println("这个表为空");
            return 0;
        }


        //检验下标是否合法
        if (pos < 0 || pos >= usedSize) {
            System.out.println("这个下标不合法");
            return 0;
        }

        //以上都满足则可以返回元素了
        return this.elem[pos];
    }


    //将指定元素更新为value
    public void set(int pos, int value) {
        if (pos < 0 || pos >= this.usedSize) {
            System.out.println("pos位置不合法");
        }
        //pos位置合法,直接更新为value
        this.elem[pos] = value;

    }

    //是否已经满了
    public boolean isFull() {
        return this.usedSize == this.elem.length;
    }


    //新增一个data元素
    public void add(int data) {
        //先判满
        if (isFull()) {
            this.elem = Arrays.copyOf(this.elem, 2 * this.elem.length);

        }
        this.elem[this.usedSize] = data;
        this.usedSize++;
    }


    //在pos位置新增元素,但是要先去挪数据(从后向前挪,因为从前向后挪会覆盖数据)
    //照样要去判满
    public void add(int data, int pos) {
        //判断pos这个下标(要插入数据的这个下标)的位置合不合法
        if (pos < 0 || pos > usedSize) {
            System.out.println("pos位置是不合法的");
            return;
        }

        //判满
        //先判满
        if (isFull()) {
            this.elem = Arrays.copyOf(this.elem, 2 * this.elem.length);

        }

        for (int i = this.usedSize - 1; i >= pos; i--) {
            //把i下标的值给到i+1下标处
            this.elem[i + 1] = this.elem[i];

        }
        //挪好了之后在pos处放数据
        this.elem[pos] = data;
        //计数器加一
        this.usedSize++;


    }


    //删除一个数据data
    //删除之前要先去找这个数据
    //找到之后,让后面的数据向前覆盖就可以删除这个数据了
    //   当i为usedSize - 1 时,i+1 的值为null,所以i必须小于usedSize - 1
    public void remove(int data) {
        //先去找一找这个元素是不是存在,找到了,就返回下标
        int index = search(data);
        if (index == -1) {
            //没有找到这个下标,说明该表中没有这个数据
            System.out.println("表中没有这个数据");
            return;
        }
        //找到啦,而且下标是index
        for (int i = index; i < usedSize - 1; i++) {
            this.elem[i] = this.elem[i + 1];
        }

        //删除了之后计数器就减一
        this.usedSize--;
    }


    //获取顺序表的长度
    public int size() {
        return this.usedSize;

    }


    //清空顺序表
    public void clear() {
        this.usedSize = 0;

    }


}